package edu.cgpi.core.util;

import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

import edu.cgpi.core.entidade.AbstractCirculo;
import edu.cgpi.core.entidade.CirculoComum;
import edu.cgpi.core.entidade.Cor;
import edu.cgpi.core.entidade.Figura;
import edu.cgpi.core.entidade.Poligono;
import edu.cgpi.core.entidade.Ponto;
import edu.cgpi.core.entidade.Reta;
import edu.cgpi.core.entidade.RetaPoligonal;
import edu.cgpi.core.entidade.Retangulo;
import edu.cgpi.core.entidade.grafico.CirculoComum2D;
import edu.cgpi.core.entidade.grafico.Imagem;
import edu.cgpi.core.entidade.grafico.Poligono2D;
import edu.cgpi.core.entidade.grafico.Ponto2D;
import edu.cgpi.core.entidade.grafico.Reta2D;
import edu.cgpi.core.entidade.grafico.RetaPoligonal2D;
import edu.cgpi.core.entidade.grafico.Retangulo2D;

public class ConversorXML {

	private static XStream xStream = new XStream(new DomDriver());

	static{
		xStream.processAnnotations(CirculoComum2D.class);
		xStream.processAnnotations(CirculoComum.class);
		xStream.processAnnotations(AbstractCirculo.class);
		xStream.processAnnotations(Poligono2D.class);
		xStream.processAnnotations(Poligono.class);
		xStream.processAnnotations(Ponto2D.class);
		xStream.processAnnotations(Ponto.class);
		xStream.processAnnotations(Reta2D.class);
		xStream.processAnnotations(Reta.class);
		xStream.processAnnotations(Retangulo2D.class);
		xStream.processAnnotations(Retangulo.class);
		xStream.processAnnotations(RetaPoligonal2D.class);
		xStream.processAnnotations(RetaPoligonal.class);
		xStream.processAnnotations(Figura.class);
		xStream.processAnnotations(Cor.class);
		xStream.setMode(XStream.NO_REFERENCES);
	}

	public static void paraXML(List<Imagem> imagens, File arquivo) {
		
		List<Imagem> imagensNorm = new ArrayList<Imagem>();
		for (Imagem imagem : imagens) {
			imagensNorm.add(imagem.normalizar());
		}
		
		String xml = xStream.toXML(new Figura(imagensNorm));

		PrintWriter out;
		try {

			if(!arquivo.exists()){
				arquivo.createNewFile();
			}

			out = new PrintWriter(arquivo);
			out.println(xml);
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static List<Imagem> deXML(File arquivo){
		Figura figura = (Figura) xStream.fromXML(arquivo);
		List<Imagem> imagens =  figura.getImagens();
		
		List<Imagem> imagensDesnorm = new ArrayList<Imagem>();
		for (Imagem imagem : imagens) {
			imagensDesnorm.add(imagem.expandir());
		}
		
		return imagensDesnorm;
	}
}